package com.zyl.blog.common.domain.rbac.vo.user;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.zyl.blog.common.annotation.Sensitive;
import com.zyl.blog.common.domain.rbac.vo.perm.PermVO;
import com.zyl.blog.common.domain.rbac.vo.role.RoleVO;
import com.zyl.blog.common.domain.router.vo.RouteVO;
import com.zyl.blog.common.enums.SensitiveType;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import lombok.experimental.Accessors;

import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * @version v1.0
 * @ProjectName: Personal_Blog_Server
 * @Package: com.zyl.blog.common.domain.rbac.vo.user
 * @ClassName: UserInfoVO
 * @Description: 用户信息VO
 * @Author FinalFantasy
 * @Date 2025/9/4-16:25
 */
@Data
@ToString
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
public class UserInfoVO implements Serializable {
    @Serial
    private static final long serialVersionUID = 1L;

    /** 用户ID */
    @JsonProperty("userId")
    private Long userId;

    /** 用户名（唯一） */
    @JsonProperty("username")
    private String username;

    /** 加密密码 */
    @JsonIgnore
    @JsonProperty("passwordHash")
    private String passwordHash;

    /** 邮箱（唯一） */
    @JsonProperty("email")
    @Sensitive(type = SensitiveType.EMAIL)
    private String email;

    /** 手机号 */
    @JsonProperty("phone")
    @Sensitive(type = SensitiveType.PHONE)
    private String phone;

    /** 昵称 */
    @JsonProperty("nickname")
    private String nickname;

    /** 真实姓名 */
    @JsonProperty("realName")
    @Sensitive(type = SensitiveType.NAME, prefixLen = 1)
    private String realName;

    /** 性别：0=女，1=男 2=未知 */
    @JsonProperty("gender")
    private Integer gender;

    /** 生日 */
    @JsonProperty("birthday")
    @Sensitive(type = SensitiveType.BIRTHDAY)
    private String birthday;

    /** 身份证号（属于敏感信息-不显示最安全） */
    @JsonProperty("idCard")
    @JsonIgnore
    private String idCard;

    /** 头像路径 */
    @JsonProperty("avatar")
    private String avatar;

    /** 个人简介 */
    @JsonProperty("bio")
    private String bio;

    /** 所在地 */
    @JsonProperty("location")
    private String location;

    /** 详细地址 */
    @JsonProperty("address")
    @Sensitive(type = SensitiveType.ADDRESS, prefixLen = 6)
    private String address;

    /** 邮编 */
    @JsonProperty("postCode")
    private String postCode;

    /** 个人网站 */
    @JsonProperty("website")
    private String website;

    /** 社交媒体链接 */
    @JsonProperty("socialLinks")
    private Map<String, String> socialLinks;

    /** 状态：0=禁用，1=正常 */
    @JsonProperty("status")
    private Integer status;

    /** 角色：reader-读者, author-作者, admin-管理员 */
    @JsonProperty("role")
    private String role;

    /** 注册时间 */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @JsonProperty(value = "createTime", access = JsonProperty.Access.READ_ONLY)
    private LocalDateTime createTime;

    /** 更新时间 */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @JsonProperty(value = "updateTime", access = JsonProperty.Access.READ_ONLY)
    private LocalDateTime updateTime;

    /** 最后登录时间 */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @JsonProperty("lastLoginTime")
    private LocalDateTime lastLoginTime;

    /** 登录次数 */
    @JsonProperty("loginCount")
    private Integer loginCount;

    /* ============ 扩展信息部分 ============*/

    /** 角色信息 */
    @JsonProperty("roles")
    private List<RoleVO> roles;

    /** 路由信息 */
    @JsonProperty("routes")
    private List<RouteVO> routes;

    /** 权限信息 */
    @JsonProperty("permissions")
    private List<PermVO> permissions;

}
